package main

import (
	"errors"
	"fmt"
)

//error 一般用在不致命的错误，用于返回错误信息，程序允许继续执行
//panic 致命错误，可能导致程序崩溃
//recover 在panic时，继续执行，需要配合defer使用
func testError(a int) (result int, err error) {
	if a == 0 {
		err = errors.New("must not 0")
	} else if a < 0 {
		defer func() {
			if error0 := recover(); error0 != nil {
				fmt.Println(error0)
			}
		}()
		panic("can't a < 0")
		//recover() 可以打印panic的错误信息，继续执行,必须放在panic之前，否则无效
	} else {
		result = a
		fmt.Println("a=", a)
	}
	return
}

func main() {
	//error
	r0, e0 := testError(0)
	if e0 != nil {
		fmt.Println("e0: ", e0)
	}
	fmt.Println("continue r0: ", r0)
	//panic
	testError(-1)
	//recover
	testError(2)
}
